<?php
/**
 * 框架的初始类文件
 * User: mrlifang
 * Date: 17/5/4
 * Time: 上午10:00
 */
//① 声明命名空间
namespace Frame;
final class Frame
{
    //公共的静态的初始化方法
    public static function run(){
        self::initCharset();    //①网页字符集设置
        self::initConfig();     //②初始化配置文件
        self::initRoute();      //③获取路由参数
        self::initConst();      //④常用常量的设置
        self::initAutoLoad();   //⑤类的自动加载
        self::initDispatch();   //⑥请求分发
    }

    /*
     * 网页字符集初始化
     * */
    private static function initCharset(){
        header("content-type:text/html;charset=utf-8");
        //开启SESSION回话
        session_start();
    }

    //初始化配置文件
    private static function initConfig(){
        $GLOBALS["config"] = require_once(APP_PATH."Conf".DS."Config.php");
    }

    //获取路由参数 获取控制器名称 动作名称 解析URL路由参数
    private static function initRoute(){
        $p = $GLOBALS["config"]["default_platform"];
        $c = isset($_GET["c"]) ? $_GET["c"] : $GLOBALS["config"]["default_controller"];
        $a = isset($_GET["a"]) ? $_GET["a"] : $GLOBALS["config"]["default_action"];
        //将参数定义为常量 方便跨方法调用
        define("PLAT",$p);
        define("CONTROLLER",$c);
        define("ACTION",$a);
    }

    //常用目录常量的设置
    private static function initConst(){
        //define("VIEW_PATH",APP_PATH."View".DS.CONTROLLER.DS);//添加视图路径常量//blogdemo/Home/View
        define("VIEW_PATH",APP_PATH."View".DS);//添加视图路径常量//blogdemo/Home/View
        define("FRAME_PATH",ROOT_PATH.DS."Frame".DS);//添加视图路径常量//blogdemo/Home/View

    }

    //类的自动加载
    private static function initAutoLoad(){

        spl_autoload_register(function($className){
            //根据传递的类名参数,来构建真实的类文件路径
            //echo $className;exit();
            $filename = ROOT_PATH.str_replace("\\",DS,$className).".class.php";

            //包含类文件
            if(file_exists($filename)){
                require_once($filename);
            }

        });

    }

    /*请求分发: 创建什么控制器对象,调用控制器的什么方法*/
    private static function initDispatch(){

        //构建控制器的类名
        $c = "\\".PLAT."\\"."Controller"."\\".CONTROLLER."Controller"; //\Home\Controller\NewsController

        //创建控制器类对象
        $controllerObj = new $c;

        $a = ACTION;

        //调用控制器对象的方法
        $controllerObj->$a();

    }

}
